package Offer;

import org.junit.Test;

/**
 * @Description
 * @Author Firenut
 * @Date 2023-01-08 11:49
 */
public class T44_findNthDigit {

    @Test
    public void test() {
        findNthDigit(1000000000);
    }

    //  解答该题的步骤
    //  1)定位n所在的数字是几位数
    //  2)定位n对应的是哪一个数字
    //  3)定位n是该数字的哪一位，从而获取到相应的数值
    public int findNthDigit(int n) {
        if(n<10){   //因为后面的start初值是1，所以在0~9要另做判断
            return n;
        }
        int digit = 1; //位数 1 2 3 4 ...

        //这两个数都要改成long类型,不然会溢出(像这种数字比较大的，建议都用long，不会出错)
        long start = 1; //第一个数是从0开始，后面的起始数字是10 100 1000 ... 为了满足这个规律，所以才写1
//        int count = 10;
        long count = 10;
        while (n > count) {
            n -= count;
            digit++;
            start *= 10;
            count = digit * start * 9; //后面这个数可能太大 会溢出
        }

        long num = start + n / digit;   //假设n初始值为10,n/digit=0 ==> num=10+0=10
        return Long.toString(num).charAt(n % digit) - '0';
    }
}